﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Strom.Core.Config;
using System.IO;
using Strom.Server.IO;
using Strom.Core.Database;

///////////////////////////////////////
//  Classe de chargement du serveur  //
///////////////////////////////////////

namespace Strom.Server
{
    static class Loader
    {
        public static bool LoadComplete { get; private set; }

        // Chargement du serveur
        public static void Load()
        {
            ServerDatas.Server = new MainServer();
            LoadXmlConfig("Config.xml");
            LoadDatabase();
            StartNetworkServer();
            LoadComplete = true;
        }

        // Chargement de la config XML
        private static void LoadXmlConfig(string fileName)
        {
            Console.WriteLine("Chargement du fichier de configuration...");

            if (File.Exists(fileName))
            {
                AutoConfig.ReadConfig(fileName);
                ServerConsole.WriteSpecialMessage("Fichier de config chargé.", ServerConsole.MessageType.Success);
            }
            else
            {
                AutoConfig.SaveConfig(fileName);
                ServerConsole.WriteSpecialMessage("Fichier de config introuvable, un nouveau a été créé.", ServerConsole.MessageType.Warning);
            }
        }

        // Chargement de la BDD
        private static void LoadDatabase()
        {
            Console.WriteLine("Chargement de la base de donnée ...");

            ServerDatas.Server.Database = new BinaryDatabase();
            ServerDatas.Server.Database.Load();

            ServerConsole.WriteSpecialMessage("Base de donnée chargée.", ServerConsole.MessageType.Success);
        }

        // Chargement des fonctionnalités réseau
        private static void StartNetworkServer()
        {
            Console.WriteLine("Démarrage des fonctionnalités réseau ...");
            LoadPackets();
            ServerDatas.Server.ClientConnected += Network.Parser.RegisterNewClientOnParser;
            ServerDatas.Server.Start(ServerDatas.IP, ServerDatas.Port);
            ServerConsole.WriteSpecialMessage("Serveur démarré sur " + ServerDatas.IP + ":" + ServerDatas.Port + ".", ServerConsole.MessageType.Success);
        }

        // Enregistrement des packets
        private static void LoadPackets()
        {
            Network.Parser.RegisterPackets();
        }
    }
}
